home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PCMania 64
/
PCMania CD64_1.iso
/
pcmania
/
virus64
/
antitxap.c
next >
Wrap
C/C++ Source or Header
|
1998-01-01
|
10KB
|
321 lines
/*----------------------------------------------*/
/* ANTITXAP (c) 1997 Por Javier Guerrero Díaz
/* Rastrea el sistema en busca del virus TXAPELA.
/*
/* La sintaxis es: ANTITXAP <unidad>.
/* El programa buscará el virus en los archivos EXE de la unidad especificada.
/* Programado con Borland C++ 5.02
/*----------------------------------------------*/
/* Javier Guerrero Díaz */
/* email: jgd@redestb.es */
/*-------------------------------*/
#include <stdio.h>
#include <dos.h>
#include <dir.h>
#include <conio.h>
#include <bios.h>
#include <stdlib.h>
#include <direct.h>
#include <string.h>
#include <io.h>
void fin(void);
void mal(void);
void intro(void);
void buscafichero(void);
void panta(void);
void mensaje(char *mensa);
void obtieneinfo(void);
void atributo(char);
void analiza(void);
void encontrado(void);
void matavir(void);
union REGS registros;
char tecla,diractual[50],dirdestino[50];
int temp,infec=0,analiz=0,pulsa;
unsigned long memlibre=0;
FILE *fichero;
struct ffblk arch;
struct date fecha;
struct dostime_t hora;
unsigned int far *word;
unsigned long salto;
char cabexe[0x1C],clave[1];
void main(argc,argv)
int argc;
char *argv[];
{
if (*argv[1]==NULL || *argv[1]=='?')
{ printf("\nANTITXAP (c)1997 Por Javier Guerrero Díaz\n");
printf("Sintaxis: ANTITXAP <directorio>\n"); exit(-1);}
getcwd(diractual,50);
_setcursortype(_NOCURSOR);
if (chdir(argv[1])==-1) { printf("\nError. No puedo acceder al directorio ");
printf("%s.\n",argv[1]); mal(); }
getcwd(dirdestino,50);
intro();
panta();
buscafichero();
fin();
}
void matavir(void)
{
unsigned long start,tamanoreal=0;
int res=0,temp,handle,parcial=0;
int far *totalpags,*numbytes;
totalpags=(int far*)MK_FP(FP_SEG(&cabexe[4]),FP_OFF(&cabexe[4]));
numbytes=(int far*)MK_FP(FP_SEG(&cabexe[2]),FP_OFF(&cabexe[2]));
if (*numbytes==0) tamanoreal=(*totalpags)*512;
else if (*numbytes>0)
{
tamanoreal=(*totalpags)-1;
parcial=*numbytes;
tamanoreal*=512;
tamanoreal+=parcial;
}
rewind(fichero);
res=fwrite(cabexe,1,0x1C,fichero);
if (res!=0x1C) {
mensaje("Error escribiendo en archivo!."); goto sale;
}
handle=fileno(fichero); res=chsize(handle,tamanoreal);
if (res!=0) {
mensaje("Error al modificar el tamaño del archivo."); goto sale;
}
mensaje("OK!. Virus eliminado del fichero.");
sale:
}
void analiza(void)
{
char virus[]={ 0xBA,0xEB,0x09,0xB8,0x05,0xFE,0xEB,0xFC,0x80,
0xC4,0x3B,0xEB,0xF4,0xBB,0x1A,0x00 };
char cadena[16];
int res=0;
unsigned int exe;
unsigned long iniciovir=0,csini=0,tamcab=0,tempo=0;
exe=getw(fichero);
if (exe==0x5A4D)
{
res=fseek(fichero,8,SEEK_SET);
if (res!=0) {
mensaje("Error gestionando fichero!."); mal();
}
tamcab=getw(fichero);
tamcab*=16;
res=fseek(fichero,0x16,SEEK_SET);
if (res!=0) {
mensaje("Error gestionando fichero!."); mal();
}
csini=getw(fichero);
csini*=16;
iniciovir=tamcab+csini;
res=fseek(fichero,iniciovir,SEEK_SET);
if (res!=0) {
mensaje("Error gestionando fichero!."); mal();
}
res=fread(cadena,1,16,fichero);
if (res!=16) {
mensaje("Error leyendo archivo!.");
}
if (strcmp(virus,cadena)==0)
{
tempo=iniciovir; iniciovir+=0x39;
res=fseek(fichero,iniciovir,SEEK_SET);
if (res!=0) {
mensaje("Error gestionando fichero!."); mal();
}
res=fread(clave,1,1,fichero);
if (res!=1) {
mensaje("Error leyendo archivo!.");
}
clave[0]^=0x90;
tempo+=0x5A2; iniciovir=tempo;
res=fseek(fichero,iniciovir,SEEK_SET);
if (res!=0) {
mensaje("Error gestionando fichero!."); mal();
}
res=fread(cabexe,1,0x1C,fichero);
if (res!=0x1C) {
mensaje("Error leyendo archivo!.");
}
for (res=0;res<0x1C;res++)
{
cabexe[res]^=clave[0];
}
encontrado();
textattr(LIGHTGRAY|BLACK<<4); clrscr(); panta(); obtieneinfo();
}
}
sale:
}
void encontrado(void)
{
window(22,8,57,20); infec++;
textattr(WHITE|RED<<4);
cprintf("╔═══════════╦══════════╦═══════════╗");
cprintf("║ ║ ATENCION ║ ║");
cprintf("║ ╚══════════╝ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ ║");
cprintf("║ PULSE LA TECLA 'SUPR' PARA MATAR ║");
cprintf("║ EL VIRUS O CUALQUIER OTRA PARA ║");
cprintf("║ IGNORAR ESTE FICHERO. ║");
cprintf("╚══════════════════════════════════╝");
gotoxy(3,5); cprintf("SE DETECTO LA MARCA DE INFECCION");
gotoxy(3,6); cprintf(" PROPIA DEL VIRUS 'TXAPELA' ");
gotoxy(3,7); cprintf(" EN ARCHIVO:");
textattr(YELLOW|RED<<4); gotoxy(19,7); cprintf("%-12s",arch.ff_name);
textattr(WHITE|BLUE<<4); window(1,1,80,25);
mensaje("Atención: Fichero infectado por el virus !.");
tecla: pulsa=bioskey(0);
switch (pulsa)
{
case 0x5300: matavir();
break;
case 0x532E: matavir();
break;
default: break;
}
}
void obtieneinfo(void)
{
getdate(&fecha);
_dos_gettime(&hora);
registros.h.ah=0x48; registros.x.bx=0xFFFF;
int86(0x21,®istros,®istros);
memlibre=registros.x.bx; memlibre*=16;
gotoxy(14,11); cprintf("%02d/%02d/%d",fecha.da_day,fecha.da_mon,fecha.da_year);
gotoxy(34,11); cprintf("%02d:%02d:%02d",hora.hour,hora.minute,hora.second);
gotoxy(62,11); cprintf("%ld",memlibre); gotoxy(32,13); cprintf("%s",dirdestino);
}
void buscafichero(void)
{
char far *atr,prot='N';
temp=findfirst("*.*",&arch,0);
while (!temp)
{ atr=(char far *)&arch.ff_attrib;
if ((*atr & 1)) { prot='Y'; atributo((*atr ^ 1)); }
obtieneinfo();
fichero=fopen(arch.ff_name,"r+b");
if (fichero==NULL)
{ gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("Error abriendo fichero!"); putch(7);
sleep(1); gotoxy(24,23);
cprintf(" ");
}
analiz++;
if (arch.ff_fsize>0x633) analiza();
gotoxy(28,15);
cprintf("%-12s",arch.ff_name);
gotoxy(62,15);
cprintf("%-8ld",arch.ff_fsize);
gotoxy(33,17);
cprintf("%-3d",analiz);
gotoxy(64,17);
cprintf("%-3d",infec);
fclose(fichero);
if (prot=='Y') { atr=(char far *)&arch.ff_attrib;
atributo((*atr | 1)); prot='N'; }
temp=findnext(&arch);
}
chdir(diractual);
}
void intro(void)
{
clrscr(); gotoxy(20,9); textattr(YELLOW|BLUE<<4);
cprintf("╔═════════════════════════════════════╗\n"); gotoxy(20,10);
cprintf("║ ANTITXAP ║\n"); gotoxy(20,11);
cprintf("║ (c) 1997 Por Javier Guerrero Diaz. ║\n"); gotoxy(20,12);
cprintf("║ Rastrea los archivos del directorio ║\n"); gotoxy(20,13);
cprintf("║ especificado como parámetro a la ║\n"); gotoxy(20,14);
cprintf("║ busqueda del virus TXAPELA. ║\n"); gotoxy(20,15);
cprintf("╚═════════════════════════════════════╝\n");
textattr(LIGHTGRAY|BLACK<<4);tecla=getch();
clrscr();
}
void panta(void)
{
window(20,2,60,7);
gotoxy(1,1);
textattr(YELLOW|BLUE<<4);
cprintf("╔═══════════════════════════════════════╗");
cprintf("║ DETECTOR/VACUNA DEL VIRUS TXAPELA ║");
cprintf("║ (C) Por Javier Guerrero Diaz ║");
cprintf("╚═══════════════════════════════════════╝");
window(5,8,75,20);
cprintf("╔═════════════════════════════════════════════════════════════════════╗");
cprintf("║ ANALISIS DE ARCHIVOS ║");
cprintf("║ ║");
cprintf("║ Fecha: Hora: Memoria Libre: bytes ║");
cprintf("║ ║");
cprintf("║ Directorio de Búsqueda: ║");
cprintf("║ ║");
cprintf("║ Nombre de Archivo : Longitud Archivo: ║");
cprintf("║ ║");
cprintf("║ Archivos Analizados: Archivos Infectados: ║");
cprintf("║ ║");
cprintf("╚═════════════════════════════════════════════════════════════════════╝");
window(1,22,80,25);
cprintf("╔══════════════════════════════════════════════════════════════════════════════╗");
cprintf("║ RESULTADO OPERACION: ║");
cprintf("╚══════════════════════════════════════════════════════════════════════════════╝");
textattr(WHITE|BLUE<<4); window(1,1,80,25);
}
void fin(void)
{
_setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
exit(0);
}
void mal(void)
{
_setcursortype(_NORMALCURSOR); textattr(LIGHTGRAY|BLACK<<4);
printf("\nPrograma finalizado anormalmente.\n");
exit(-1);
}
void mensaje(mensa)
char mensa[50];
{
window(1,1,80,25); textattr(WHITE|BLUE<<4); gotoxy(24,23);
cprintf(" ");
gotoxy(24,23); cprintf("%s",mensa); putch(7);
sleep(1); gotoxy(24,23);
cprintf(" ");
}
void atributo(attrib)
char attrib;
{
int nombre;
registros.x.ax=0x4301; registros.x.cx=attrib;
nombre=FP_OFF(&arch.ff_name); registros.x.dx=nombre;
int86(0x21,®istros,®istros);
if (registros.x.cflag!=0) {
mensaje("Error: No se pudo cambiar atributo de fichero."); mal(); }
}